package com.example.demo7list;

import java.util.LinkedList;

/**
 * 目标：用LinkedList做一个队列对象。
 */
public class ListDemo2 {
    public static void main(String[] args) {
        // 目标：用LinkedList做一个队列对象。
        LinkedList<String> queue = new LinkedList<>();
        /*
        LinkedList底层是基于双向链表存储数据的。
        链表的特点：
        链表中的数据是一个一个独立的结点组成的，结点在内存中是不连续的，每个结点包含数据值和下一个结点的地址。
        链表的特点1：查询慢，无论查询哪个数据都要从头开始找。
        链表的特点2：链表增删相对快

        双向列表
        特点：对首尾元素进行增删改查的速度是极快的。
         */

        // 入队
        queue.addLast("赵敏");
        queue.addLast("西门吹雪");
        queue.addLast("陆小凤");
        queue.addLast("石观音");
        System.out.println(queue); // [赵敏, 西门吹雪, 陆小凤, 石观音]

        // 出队
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue);

        System.out.println("-------------------------------------------------");

        // 做一个栈
        LinkedList<String> stack = new LinkedList<>();
        // 压栈
        // push 方法底层调用的就是addLast方法 就是包装了一下
        stack.push("第1颗子弹");
        stack.push("第2颗子弹");
        stack.push("第3颗子弹");
        stack.push("第4颗子弹");
        System.out.println(stack);  // [第4颗子弹, 第3颗子弹, 第2颗子弹, 第1颗子弹]

        // 出栈
        // pop 方法底层调用的就是removeLast方法 就是包装了一下
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack);
    }
}
